/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controlacciones.ejb3.dao;

import controlacciones.ejb3.pojo.TableBeanBinding_DatosArchivoProgramaCorte;
import helper.Utiles_Archivo_Serv;
import java.io.File;
import java.io.IOException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.sql.DataSource;

/**
 *
 * @author Vanessa
 */
@Stateless
public class ServicioIntegracionDAOBean implements ServicioIntegracionDAOLocal {
    
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method" or "Web Service > Add Operation")
    @PostConstruct
    private void inicia(){
        try {
            cn = ds.getConnection();
        } catch (SQLException ex) {
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @PreDestroy
    private void finaliza(){
        try {
            cn.close();
        } catch (SQLException ex) {
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void procesaProgramaCorte( String fileName ){        

        File archivoFuente =  new File( pathSystem + fileName );
        File fprocesar = new File( path + fileName );

        try {
            Utiles_Archivo_Serv.copy(archivoFuente, fprocesar);
        } catch (IOException ex) {
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        File fbd =  new File(path + "progcort.dbf");        
        File fverificacion = new File( path + "temp.dat" );
        //Verificando el estado del job
        int status = -1;
        while(true){
            status = this.getStatusJob("jobIniciarProgramaCortes");
            if( status  == 4 ){ //Si esta inactivo entonces salir
                System.out.println( "saliendo del while ya que el job esta disponoble para ejecutarse" );
                break;
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        //Duermo un rato la aplicacion esperando a q esta se actualize en su estado
        try {
            Thread.sleep(3000);
        } catch (InterruptedException ex) {
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        fprocesar.renameTo( fbd );
        //Eliminamos el archivo si existiese
        if( fverificacion.exists() ){
            boolean ind =  fverificacion.delete();
            System.out.println("Eliminando archivo:" + ind);
        }

        //Connection cn = null;
        CallableStatement cs = null, cs2 = null;
        try {
            System.out.println("Iniciando programa de integracion");
            //cn = ds.getConnection();
            System.out.println("Se obtuvo la conexion");
            cs = cn.prepareCall("{call spProcesarProgramaCortes()}");
            cs.execute();
            System.out.println("Se ejecuto procedimiento");
        } catch (SQLException ex) {
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            try {
                cs.close();    
            } catch (SQLException ex) {
                Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        //Verificamos hasta que el trabajo del SQL Server haya terminado
        status = -1;
        System.out.println("Antes de renombrar el archivo");
        while(true){
            //Cuando la operacion se completa con éxito debemos renombrar el archivo            
            if(fverificacion.exists()){
            //status = this.getStatusJob("jobIniciarProgramaCortes");
            //if( status == 4 ){
                System.out.println("Renombrando el archivo");
                //fbd.renameTo( new File( path + fileName.toLowerCase() + "p" ) );
                fbd.delete(); //Elimino el archivo local una vez procesado
                archivoFuente.renameTo(new File( pathSystem + fileName.toLowerCase() + "p" )); // renombro el archivo una vez procesado

                break;
            }
        }
        try {
            System.out.println("Registrando programa de corte");
            cs2 = cn.prepareCall("{call spRegistrarProgramaCortes()}");
            cs2.execute();
        } catch (SQLException ex) {
            try {
                cs2.close();
                //cn.close();
            } catch (SQLException ex1) {
                Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex1);
            }
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

     public void integraProgramaCorte( String fileName ){

        File archivoFuente =  new File( pathSystem + fileName );
        File fprocesar = new File( path + fileName );

        try {
            Utiles_Archivo_Serv.copy(archivoFuente, fprocesar);
        } catch (IOException ex) {
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        File fbd =  new File(path + "progcort.dbf");
        File fverificacion = new File( path + "temp.dat" );
        //Verificando el estado del job
        int status = -1;
        while(true){
            status = this.getStatusJob("jobIniciarProgramaCortes");
            if( status  == 4 ){ //Si esta inactivo entonces salir
                System.out.println( "saliendo del while ya que el job esta disponoble para ejecutarse" );
                break;
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        //Duermo un rato la aplicacion esperando a q esta se actualize en su estado
        try {
            Thread.sleep(3000);
        } catch (InterruptedException ex) {
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        fprocesar.renameTo( fbd );
        //Eliminamos el archivo si existiese
        if( fverificacion.exists() ){
            boolean ind =  fverificacion.delete();
            System.out.println("Eliminando archivo:" + ind);
        }

        //Connection cn = null;
        CallableStatement cs = null, cs2 = null;
        try {
            System.out.println("Iniciando programa de integracion");
            //cn = ds.getConnection();
            System.out.println("Se obtuvo la conexion");
            cs = cn.prepareCall("{call spProcesarProgramaCortes()}");
            cs.execute();
            System.out.println("Se ejecuto procedimiento");
        } catch (SQLException ex) {
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            try {
                cs.close();
            } catch (SQLException ex) {
                Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        //Verificamos hasta que el trabajo del SQL Server haya terminado       
     }

     public void registraProgramaCorte( String sector, String urba ){
        CallableStatement  cs2 = null;
        try {
            System.out.println("Registrando programa de corte");
            cs2 = cn.prepareCall("{call spRegistrarProgramaCortes()}");
            cs2.execute();
        } catch (SQLException ex) {
            try {
                cs2.close();
                //cn.close();
            } catch (SQLException ex1) {
                Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex1);
            }
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public List<TableBeanBinding_DatosArchivoProgramaCorte> getListaArchivosProcesados(){
        System.out.println("Realizando consulta de procesados");
        List<TableBeanBinding_DatosArchivoProgramaCorte> lista = new ArrayList(1);
        File folder = new File(pathSystem);
        File[] archivos = folder.listFiles();

        if( archivos != null ){
            for( File f : archivos ){
                //System.out.println( "Archivo encontrado:" + f.getName() );
                if( f.getName().toLowerCase().endsWith("dbfp") ){
                    lista.add(new TableBeanBinding_DatosArchivoProgramaCorte(true, f.getName(), new SimpleDateFormat().format(new Date(f.lastModified()))));
                }
            }
        }
        return lista;
    }

    public List<TableBeanBinding_DatosArchivoProgramaCorte> getListaArchivosPendientes(){
        System.out.println("Realizando consulta de pendientes");
        List<TableBeanBinding_DatosArchivoProgramaCorte> lista = new ArrayList(1);
        File folder = new File(pathSystem);
        File[] archivos = folder.listFiles();
        System.out.println( "Cantidad de archivos encontrados:" + archivos.length );
        if( archivos != null ){
            for( File f : archivos ){
                System.out.println( "Archivo encontrado:" + f.getName() );
                if( f.getName().toLowerCase().endsWith("dbf") ){
                    lista.add(new TableBeanBinding_DatosArchivoProgramaCorte(false, f.getName(), new SimpleDateFormat().format(new Date(f.lastModified()))));
                }
            }
        }
        return lista;
    }

    public int getStatusJob( String jobname ){
        int status = -1;

        //Connection cn = null;
        CallableStatement cs = null;
        ResultSet res = null;
        try {
            //cn = ds.getConnection();
            cs = cn.prepareCall("{call msdb.dbo.sp_help_job(?,?,?,?,?,?,?,?,?,?,?,?,?)}");
            cs.setString(1, null);
            cs.setString(2, jobname);
            cs.setString(3, "JOB");
            cs.setString(4, null);
            cs.setString(5, null);
            cs.setString(6, null);
            cs.setString(7, null);
            cs.setString(8, null);
            cs.setString(9, null);
            cs.setString(10, null);
            cs.setString(11, null);
            cs.setString(12, null);
            cs.setString(13, null);

            res = cs.executeQuery();
            res.next();
            status = res.getInt("current_execution_status"); //Obtengo el estado del JOB
            System.out.println( "Estado del job:" + status );

        } catch (SQLException ex) {
            Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            try {
                res.close();
                cs.close();
            } catch (SQLException ex) {
                Logger.getLogger(ServicioIntegracionDAOBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return status;
    }

    @Resource(name = "jdbc/Comercial")
    DataSource ds;

    //public static String path = "D:/CAS/dbf/"; //Representa la ruta local donde se van a procesar los archivos
    public static String path = "F:/sistemaRRHH/CONTROL DE ACCIONES/SICI/"; //Representa la ruta local donde se van a procesar los archivos
    public static String pathSystem = "S:/APLICA/Cobranza/Triveca/"; //Representa la ruta o unidad de red donde se encuentran los archivos generados por el sistema de programa de cortes

    public Connection cn = null;
}
